﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Globalization;

namespace Clinica_Frba
{
    public partial class RegistrarAgenda : Form
    {
        TimeSpan treintaMinutos = new TimeSpan(0, 0, 30, 0, 0);
        Conexion sql = Conexion.getInstance();
        Utility util = Utility.getInstance();
        DateTime fechaActual;
        bool gridValid = true;
        bool profesionalValid = true;
        bool fechasValid = true;
        string idProfesional;
        string message;
        string[] tablaIdDias = {"Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"};

        public RegistrarAgenda()
        {
            InitializeComponent();
        }

        private void RegistrarAgenda_Load(object sender, EventArgs e)
        {
            string usuarioActivo = util.getUserName();
            int rolActivo = util.getIdRol();
            string idAfiliado = "";
            this.dataGrid.DataError += new DataGridViewDataErrorEventHandler(dataGrid_DataError);
            this.dataGrid.RowsAdded += new DataGridViewRowsAddedEventHandler(dataGrid_RowsAdded);
            this.dataGrid.LostFocus += new EventHandler(dataGrid_LostFocus);
            this.dataGrid.CellClick += new DataGridViewCellEventHandler(dataGrid_CellClick);
            this.dataGrid.CellEndEdit += new DataGridViewCellEventHandler(dataGrid_CellEndEdit);
            fechaActual = DateTime.ParseExact(util.getAppDate() + " " + util.getAppHora(), "yyyyMMdd HH:mm:ss", CultureInfo.InvariantCulture);
           
            if (rolActivo == 3)
            {
                try
                {
                    SqlCommand query = new SqlCommand
                       ("select me.id_medico from b_sharp.Medicos me " +
                       "join b_sharp.usuarios u on u.id_usuario = me.id_usuario " +
                       "where u.id_usuario = @usuario;", sql.openCon());
                    query.Parameters.AddWithValue("@usuario", usuarioActivo);

                    idAfiliado = Convert.ToString(query.ExecuteScalar());

                    this.Id_Profesional.Text = idAfiliado;
                    setNombreMed();
                    buttonBuscarMed.Visible = false;
                }
                catch (Exception)
                {
                    MessageBox.Show("Error");
                }
            }
            else // no es profesional
            {
                idAfiliado = "";
                this.Id_Profesional.Enabled = true;
                this.Id_Profesional.ReadOnly = false;
            }


            this.HorarioInicio.ValueType = typeof(DateTime);
            this.HorarioFin.ValueType = typeof(DateTime);

            dataGrid.Rows[0].Cells[1].Value = "07:00";
            dataGrid.Rows[0].Cells[2].Value = "20:00";
            dataGrid.Rows[0].Cells[0].Value = "";
            dataGrid.Columns[1].DefaultCellStyle.Format = "HH:mm";
            dataGrid.Columns[2].DefaultCellStyle.Format = "HH:mm";

            this.FechaInicio.MinDate = fechaActual;
            this.FechaInicio.MaxDate = fechaActual.AddDays(120);
            this.FechaFin.MinDate = fechaActual;
            this.FechaFin.MaxDate = fechaActual.AddDays(120);
            this.FechaInicio.Text = Convert.ToString(fechaActual);
            this.FechaFin.Text = Convert.ToString(fechaActual.AddDays(120));

        }

        void dataGrid_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != dataGrid.Rows.Count - 1)
            {
                if (e.ColumnIndex != 3)
                {
                    string dia = dataGrid.Rows[e.RowIndex].Cells[0].Value.ToString();
                    TimeSpan horaInicio = Convert.ToDateTime(dataGrid.Rows[e.RowIndex].Cells[1].Value).TimeOfDay;
                    TimeSpan horaFin = Convert.ToDateTime(dataGrid.Rows[e.RowIndex].Cells[2].Value).TimeOfDay;
                    if (dia == "Sábado")
                    {
                        TimeSpan horarioInicioSabado = TimeSpan.FromHours(10);
                        TimeSpan horarioFinSabado = TimeSpan.FromHours(15);
                        if (horaInicio < horarioInicioSabado || horaInicio > horarioFinSabado)
                        {
                            dataGrid.Rows[e.RowIndex].Cells[1].Value = "10:00";
                            labelGridError.Text = "El horario de atención es de 10:00 a 15:00";
                            labelTipoErrorGrid.Text = "*Sábados";
                            labelGridError.Visible = true;
                            labelTipoErrorGrid.Visible = true;
                        }
                        if (horaFin > horarioFinSabado || horaFin < horarioInicioSabado)
                        {
                            dataGrid.Rows[e.RowIndex].Cells[2].Value = "15:00";
                            labelGridError.Text = "El horario de atención es de 10:00 a 15:00";
                            labelTipoErrorGrid.Text = "*Sábados";
                            labelGridError.Visible = true;
                            labelTipoErrorGrid.Visible = true;
                        }
                    }
                    else
                    {
                        if (horaInicio < TimeSpan.FromHours(7) || horaInicio > TimeSpan.FromHours(20))
                        {
                            dataGrid.Rows[e.RowIndex].Cells[1].Value = "07:00";
                            labelGridError.Text = "El horario de atención es de 07:00 a 20:00";
                            labelTipoErrorGrid.Text = "";
                            labelGridError.Visible = true;
                        }
                        if (horaFin > TimeSpan.FromHours(20) || horaFin < TimeSpan.FromHours(7))
                        {
                            dataGrid.Rows[e.RowIndex].Cells[2].Value = "20:00";
                            labelGridError.Text = "El horario de atención es de 07:00 a 20:00";
                            labelTipoErrorGrid.Text = "";
                            labelGridError.Visible = true;
                        }
                    }
                }

                /*if (e.ColumnIndex == 1 | e.ColumnIndex == 2)
                {
                    //MessageBox.Show((Convert.ToString(Convert.ToDateTime(dataGrid[e.ColumnIndex, e.RowIndex].Value).TimeOfDay.Minutes)));
                    if ((Convert.ToDateTime(dataGrid[e.ColumnIndex, e.RowIndex].Value).TimeOfDay.Minutes > 0) && (Convert.ToDateTime(dataGrid[e.ColumnIndex, e.RowIndex].Value).TimeOfDay.Minutes < 30))
                    {
                        int minutes = Convert.ToDateTime(dataGrid[e.ColumnIndex, e.RowIndex].Value).TimeOfDay.Minutes;
                        dataGrid[e.ColumnIndex, e.RowIndex].Value = Convert.ToDateTime((Convert.ToDateTime(dataGrid[e.ColumnIndex, e.RowIndex].Value)).TimeOfDay.Subtract(new TimeSpan(0, minutes, 0))).ToString("HH:mm");
                    }
                    if ((Convert.ToDateTime(dataGrid[e.ColumnIndex, e.RowIndex].Value).TimeOfDay.Minutes > 30))
                    {
                        int minutes = Convert.ToDateTime(dataGrid[e.ColumnIndex, e.RowIndex].Value).TimeOfDay.Minutes - 30;
                        dataGrid[e.ColumnIndex, e.RowIndex].Value = Convert.ToDateTime((Convert.ToDateTime(dataGrid[e.ColumnIndex, e.RowIndex].Value)).TimeOfDay.Subtract(new TimeSpan(0, minutes, 0))).ToString("HH:mm");
                    }
                }*/

                if (e.ColumnIndex == 0)
                {
                    for (int i = 0; i < dataGrid.Rows.Count - 1; i++)
                    {
                        if ((i != e.RowIndex) && (dataGrid.Rows[e.RowIndex].Cells[0].Value.ToString() == dataGrid.Rows[i].Cells[0].Value.ToString()))
                        {
                            dataGrid.Rows[e.RowIndex].Cells[0].Value = DiaSemana.Items[0].ToString();
                            labelGridError.Text = "*Día " + dataGrid.Rows[e.RowIndex].Cells[0].Value  + " ya seleccionado";
                            labelTipoErrorGrid.Text = "";
                            labelGridError.Visible = true;
                            labelTipoErrorGrid.Visible = true;
                        }
                    }
                }
            }
        }

        void dataGrid_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != dataGrid.Rows.Count - 1)
            {
                if (e.ColumnIndex == 3)
                {
                    dataGrid.Rows.RemoveAt(e.RowIndex);
                }

            }
        }

        private void FechaInicio_ValueChanged(object sender, EventArgs e)
        {
            //this.FechaFin.MaxDate = Convert.ToDateTime(this.FechaInicio.Text).AddDays(120);
            this.FechaFin.MinDate = Convert.ToDateTime(this.FechaInicio.Text);
        }



        private void botonLimpiar_Click(object sender, EventArgs e)
        {
            foreach (Control control in this.Controls)
            {
                if (((control.GetType().ToString() == "System.Windows.Forms.DateTimePicker") || ((control.GetType().ToString() == "System.Windows.Forms.TextBox")) && (control.Enabled == true)))
                {
                    control.ResetText();
                }
            }
            while (dataGrid.Rows.Count > 1)
                dataGrid.Rows.RemoveAt(0);

            dataGrid.Rows[0].Cells[0].Value = "";
            dataGrid.Rows[0].Cells[1].Value = "07:00";
            dataGrid.Rows[0].Cells[2].Value = "20:00";

            this.FechaInicio.Text = Convert.ToString(fechaActual);
            this.FechaFin.Text = Convert.ToString(fechaActual.AddDays(120));

            nombreMed.Visible = false;
        }



        public void dataGrid_DataError(object sender, EventArgs e)
        {

        }



        private void botonRegistrar_Click(object sender, EventArgs e)
        {
            setNombreMed();

            message = "";

            if (validarForm())
            {
                SqlCommand insertarAgendaProfesional = new SqlCommand
                    ("INSERT INTO b_sharp.AgendaProfesional(id_medico,fechaInicio,fechaFin) VALUES (@idProf, @fechaI, @fechaF);", sql.openCon());
                insertarAgendaProfesional.Parameters.AddWithValue("@idProf", idProfesional);
                insertarAgendaProfesional.Parameters.AddWithValue("@fechaI", this.FechaInicio.Text);
                insertarAgendaProfesional.Parameters.AddWithValue("@fechaF", this.FechaFin.Text);
                insertarAgendaProfesional.ExecuteNonQuery();

                SqlCommand buscarIdAgenda = new SqlCommand
                    ("SELECT id_agenda FROM b_sharp.AgendaProfesional WHERE id_medico = @idProf AND fechaInicio = @fechaI AND fechaFin = @fechaF AND bajaLogica = 'N';", sql.openCon());
                buscarIdAgenda.Parameters.AddWithValue("@idProf", idProfesional);
                buscarIdAgenda.Parameters.AddWithValue("@fechaI", this.FechaInicio.Text);
                buscarIdAgenda.Parameters.AddWithValue("@fechaF", this.FechaFin.Text);
                string idAgenda = buscarIdAgenda.ExecuteScalar().ToString();

                for (int i = 0; i < this.dataGrid.Rows.Count - 1; i++)
                {
                    string dia = this.dataGrid.Rows[i].Cells[0].Value.ToString();
                    int idDia = 0;

                    for (int l = 0; l < tablaIdDias.Length; l++)
                    {
                        if (dia == tablaIdDias[l])
                        {
                            idDia = l + 1;
                        }
                    }
                    try
                    {
                        SqlCommand insertarHorariosAgenda = new SqlCommand
                            ("INSERT INTO b_sharp.AgendaProfHorarios VALUES(@idMedico, @idAgenda, @dia, @horaI, @horaF);", sql.openCon());
                        insertarHorariosAgenda.Parameters.AddWithValue("@idAgenda", idAgenda);
                        insertarHorariosAgenda.Parameters.AddWithValue("@idMedico", idProfesional);
                        insertarHorariosAgenda.Parameters.AddWithValue("@dia", idDia);
                        insertarHorariosAgenda.Parameters.AddWithValue("@horaI", Convert.ToDateTime(this.dataGrid.Rows[i].Cells[1].Value).ToString("HH:mm"));
                        insertarHorariosAgenda.Parameters.AddWithValue("@horaF", Convert.ToDateTime(this.dataGrid.Rows[i].Cells[2].Value).ToString("HH:mm"));
                        insertarHorariosAgenda.ExecuteNonQuery();
                    }
                    catch (SqlException)
                    {
                        MessageBox.Show("Error de Horarios ingresados");
                    }
                }
                MessageBox.Show("La agenda ha sido creada exitosamente");
                this.Close();
            }
            else
            {
                if (message.Length > 0)
                    MessageBox.Show(message, "Error");
                else
                    MessageBox.Show("Verifique los datos ingresados.", "Error");

                gridValid = true;
                profesionalValid = true;
                fechasValid = true;
            }

        }

        public bool validarForm()
        {
            validarGrid();

            validarId();

            validarFechas();

            if (!fechasValid || !profesionalValid)
            {
                return false;
            }

            if (!gridValid)
            {
                labelGridError.Visible = true;
                labelTipoErrorGrid.Visible = true;
                return false;
            }
            else
            {
                labelGridError.Visible = false;
                labelTipoErrorGrid.Visible = false;
            }

            return true;
        }

        public void validarId()
        {
            idProfesional = this.Id_Profesional.Text;
            int intIdProfesional;
            if (int.TryParse(idProfesional, out intIdProfesional))
            {
                SqlCommand query = new SqlCommand
                   ("select * from b_sharp.Medicos m  where m.id_medico = @idProf;", sql.openCon());

                query.Parameters.AddWithValue("@idProf", idProfesional);

                SqlDataReader reader = query.ExecuteReader();

                if (!reader.HasRows)
                {
                    profesionalValid = false;
                    this.labelProfesionalError.Visible = true;
                    this.labelProfesionalError.Text = "*Id de Profesional inexistente";
                }
                else //el afiliado existe!
                {
                    profesionalValid = true;
                    this.labelProfesionalError.Visible = false;
                }

            }
            else
            {
                profesionalValid = false;
                this.labelProfesionalError.Visible = true;
                this.labelProfesionalError.Text = "*Verifique el número de Profesional";
            }
        }

        public void validarGrid()
        {
            TimeSpan cargaHoraria = TimeSpan.FromHours(0);

            if (this.dataGrid.Rows.Count > 1)
            {
                for (int i = 0; i < this.dataGrid.Rows.Count - 1; i++)
                {
                    string dia = this.dataGrid.Rows[i].Cells[0].Value.ToString();
                    if (!(tablaIdDias.Contains(dia)) || dia == "Domingo")
                    {
                        gridValid = false;
                        labelGridError.Text = "*Verifique los datos ingresados.";
                        //labelTipoErrorGrid.Text = "Verifique los dias. Atención de Lunes a Sábado";
                        message += "No se pueden repetir los dias\n";
                        labelTipoErrorGrid.Visible = true;
                        labelGridError.Visible = true;
                    }
                    TimeSpan horaInicio = TimeSpan.FromHours(0);
                    TimeSpan horaFin = TimeSpan.FromHours(0);
                    if (TimeSpan.TryParse(Convert.ToDateTime(this.dataGrid.Rows[i].Cells[1].Value).ToString("HH:mm"), out horaInicio) && TimeSpan.TryParse(Convert.ToDateTime(this.dataGrid.Rows[i].Cells[2].Value).ToString("HH:mm"), out horaFin))
                    {
                        if (horaInicio >= horaFin)
                        {
                            gridValid = false;
                            //labelTipoErrorGrid.Text = "Verifique las horas";
                            message += "La hora de inicio es mayor o igual a la hora de fin\n";
                            labelGridError.Text = "*Verifique los datos ingresados.";
                            labelGridError.Visible = true;
                            labelTipoErrorGrid.Visible = true;
                        }
                        else //los horarios y los dias estan en formato correcto
                        {
                            TimeSpan hora = horaInicio;
                            while (hora < horaFin)
                                hora = hora.Add(treintaMinutos);

                            if (hora != horaFin)
                            {
                                message = "Los turnos solo pueden ser de media hora, corriga el horario\n";
                                gridValid = false;
                            }

                            if (gridValid == true)
                            {
                                cargaHoraria = cargaHoraria.Add(horaFin - horaInicio);
                            }
                        }
                    }
                    else
                    {
                        gridValid = false;
                        //labelTipoErrorGrid.Text = "Formato Horas: HH:mm";
                        message += "El formato de hora debe ser 24hs HH:mm\n";
                        labelGridError.Text = "*Verifique los datos ingresados.";
                    }
                }

            }
            else
            {
                gridValid = false;
                labelTipoErrorGrid.Text = "";
                labelGridError.Text = "*Ingrese datos.";
            }

            if (!(cargaHoraria < TimeSpan.FromHours(48)))
            {
                gridValid = false;
                //labelTipoErrorGrid.Text = "Verifique las horas: cantidad de horas semanales excesiva.";
                message += "Cantidad de horas semanales mayor a 48 horas\n";
                //labelGridError.Visible = true;
            }
            else
            {
                
            }

        }

        public void validarFechas()
        {
            DateTime fechaInicial = Convert.ToDateTime(this.FechaInicio.Text);
            DateTime fechaFinal = Convert.ToDateTime(this.FechaFin.Text);
            if (fechaFinal > fechaActual.AddDays(120))
            {
                fechasValid = false;
                //labelFechaError.Text = "*La fecha final debe ser dentro de un máximo de 120 días.";
                //labelFechaError.Visible = true;
                message += "La fecha final debe ser dentro de un máximo de 120 días\n";
            }
            else
            {
            }

            if (fechaInicial >= fechaFinal)
            {
                fechasValid = false;
                //labelFechaError.Text = "*Verifique las fechas.";
                //labelFechaError.Visible = true;
                message += "Fecha inicial es mayor o igual a la fecha final\n";
            }
            else
            {
            }


            SqlDataReader reader = sql.execQuery
                ("SELECT * FROM b_sharp.AgendaProfesional WHERE id_medico = '" + Id_Profesional.Text + 
                "' AND bajaLogica = 'N';");

            while (reader.Read())
            {
                DateTime fechaAgendaI = reader.GetDateTime(2);
                DateTime fechaAgendaF = reader.GetDateTime(3);
                DateTime fechaAgregarI = Convert.ToDateTime(FechaInicio.Text);
                DateTime fechaAgregarF = Convert.ToDateTime(FechaFin.Text);
                if (interseccion(fechaAgregarI, fechaAgregarF, fechaAgendaI, fechaAgendaF))
                {
                    fechasValid = false;
                    //labelFechaError.Text = "*Profesional ingresado ya tiene agenda para días seleccionados";
                    //labelFechaError.Visible = true;
                    message += "Profesional ingresado ya tiene agenda para días seleccionados\n";
                }

            }

            if (!fechasValid)
            {
                labelFechaError.Visible = true;
            }
            else
            {
                labelFechaError.Visible = false;
            }
        }

        private bool interseccion(DateTime fechaI1, DateTime fechaF1, DateTime fechaI2, DateTime fechaF2)
        {
            if (((fechaI1 <= fechaI2) && (fechaF1 >= fechaI2)) || (fechaI1 >= fechaI2) && (fechaI1 <= fechaF2))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        private void dataGrid_RowsAdded(object sender, EventArgs e)
        {
            dataGrid.Rows[dataGrid.Rows.Count - 1].Cells[0].Value = "";
            dataGrid.Rows[dataGrid.Rows.Count - 1].Cells[1].Value = "07:00";
            dataGrid.Rows[dataGrid.Rows.Count - 1].Cells[2].Value = "20:00";
            
        }

        void dataGrid_LostFocus(object sender, EventArgs e)
        {
            labelGridError.Visible = false;
            labelTipoErrorGrid.Visible = false;
        }

        private void buttonBuscarMed_Click(object sender, EventArgs e)
        {
            int idMed;
            ListaProfesionales medicoForm = new ListaProfesionales();

            idMed = medicoForm.searchMedico();

            if (idMed != -1)
            {
                Id_Profesional.Text = idMed.ToString();

                setNombreMed();
            }
        }

        private void idProfEnter(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
            {
                setNombreMed();
            }
        }

        private void setNombreMed()
        {
            int idMed;
            SqlDataReader reader;

            if (nombreMed.Visible == true)
                return;

            if (Id_Profesional.Text.Length == 0)
                return;

            idMed = Convert.ToInt32(Id_Profesional.Text);

            reader = sql.execQuery("SELECT (Medico_Nombre + ' ' + Medico_Apellido) nom " +
                   " FROM b_sharp.Medicos where id_medico = " + idMed + ";");

            if (reader.Read())
            {
                nombreMed.Text = reader.GetString(0);
                nombreMed.Visible = true;
            }
        }

        
        
    }
}
